
# 集合
# 格式：s1={1,2,3}
# 注意：
# 1.集合是无序的，里面的元素是唯一的。
# 2.可以用于元组或者列表去重

s1 = {} #定义空字典
print(s1,type(s1)) # <class 'dict'>

# 定义空集合
s1 = set()
print(s1,type(s1)) #<class 'set'>

# 集合无序性
s2 = {'a','b','c','d','e'}
print(s2) # 每次输出结果顺序都不一样

# 集合无序的实现涉及哈希表
print(hash('a'))
print(hash('b'))
print(hash('c'))
# 每次运行结果hash值都不同，在hash表中的位置都不同，这就实现了集合的无序性
print(hash(1))
print(hash(2))
print(hash(3))
# 在python中整型的hash就是它本身，在hash表中的位置不变，所以顺序不会改变
print(hash('1'))
print(hash('2'))
print(hash('3'))
# 用引号括起来，整形就变成了字符串类型，在hash表中的位置就会不同，所以顺序就会变
# 无序性，不能修改集合中的值

# 唯一性,自动去重
s2 = {'a','b','c','d','e','a','b'}
print(s2)

# 集合的常见操作
# add() 添加一个元素
s3 = {1,2,3}
s4 = 4
# 集合的唯一性决定了如果需要添加的元素在原集合中存在，则不会进行任何操作，一次只能添加一个元素
s3.add(s4)
print(s3) #{1, 2, 3, 4}
s3.add((5,6)) # 添加一个元祖
print(s3) #{1, 2, 3, 4, (5, 6)}


# update() 分散添加，把传入的元素拆分(需要一个可迭代对象)，一个个放进集合中 （无序）
s1 = {1,2,3}
s2 = {4,5,6}
s1.update(s2)
print(s1) #{1, 2, 3, 4, 5, 6}
s3 = '789'
s1.update(s3)
print(s1) #{1, 2, 3, 4, 5, 6, '8', '7', '9'}
s1.update((10,11,12)) #元素必须是能被for循环的可迭代对象
print(s1) #{1, 2, 3, 4, 5, 6, 10, 11, 12, '9', '7', '8'}

# 删除元素
# remove() 如果集合中有要删除的元素就删除，没有就报错
s1 = {1,2,3,4}
s1.remove(1)
print(s1)
# s1.remove(1) #报错，已经删除了

# pop()
s1 = {1,2,3,4}
s1.pop() # 默认删除根据hash表排序后的第一个元素
print(s1)

# discard() 选择需要删除的元素，有就删除，没有则不会有任何操作
s1 = {1,2,3,4}
s1.discard(4)
print(s1)
print(s1) #不会报错

# 交集和并集
# 交集 & 共有的部分
a = {1,2,3,4}
b = {3,4,5,6}
c = {7,8,9}
print(a & b)  #{3, 4}
print(a & c)  # 没有共有的部分返回空集合set()

# 并集 | 所有的都放一起，重复的不算（集合的唯一性）
a = {1,2,3,4}
b = {3,4,5,6}
print(a | b)


